let a :number
a = 10
// a = 'aaa'

// 如果变量声明的时候赋了初始值，TS可以自动对变量进行类型检测
let b = false
// b = 1

function sum(a :number, b :number) :number {
    // return ''
    return a + b
}

console.log(sum(111, 222));
// console.log(sum(111, '222'));

// 字面量声明
let sex: 'male' | 'female'
sex = 'male'
sex = 'female'
// sex = 'aaa'


let bol: string | boolean
bol = 'aaa'
bol = true

// any 表示任意类型 相当于对该变量关闭了类型检测 (不建议使用)
let all: any
all = 1
all = 'aaa'
all = false

// 声明变量不指定类型 则TS解析器会自动判断变量的类型为 ang (隐式 any)
let all2
all2 = 1
all2 = 'aaa'
all2 = false

// unknown 表示未知类型的值
let unk: unknown
unk = 2
unk = false
unk = 'aaa'

let s: string
s = all

// unknown 是一个类型安全的 any
// unknown 不能直接赋值给其他类型的变量
// s = unk
if (typeof unk === 'string') {
    s = unk
}

// 类型断言 告诉解析器变量的实际类型
/**
 * 语法如下两种
 */
s = unk as string
s = <string>unk

// void 表示空，没有返回值(返回空值)
function fn(): void {
    return null
}

// never 表示永远不会返回结果
function fn2(): never {
    throw 'error'
}